{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Knowledge graph link prediction with DistMult"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "nbsphinx": "hidden",
    "tags": [
     "CloudRunner"
    ]
   },
   "source": [
    "<table><tr><td>Run the latest release of this notebook:</td><td><a href=\"https://mybinder.org/v2/gh/stellargraph/stellargraph/master?urlpath=lab/tree/demos/link-prediction/distmult-link-prediction.ipynb\" alt=\"Open In Binder\" target=\"_parent\"><img src=\"https://mybinder.org/badge_logo.svg\"/></a></td><td><a href=\"https://colab.research.google.com/github/stellargraph/stellargraph/blob/master/demos/link-prediction/distmult-link-prediction.ipynb\" alt=\"Open In Colab\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\"/></a></td></tr></table>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This notebook reproduces the experiments done in the paper that introduced the DistMult algorithm: Embedding Entities and Relations for Learning and Inference in Knowledge Bases, Bishan Yang, Scott Wen-tau Yih, Xiaodong He, Jianfeng Gao and Li Deng, ICLR 2015. https://arxiv.org/pdf/1412.6575\n",
    "\n",
    "In table 2, the paper reports 2 metrics measured on the WN18 and FB15K datasets (and FB15k-401): MRR (mean reciprocal rank) and Hits at 10. These are computed as \"filtered\", where known edges (in the train, test or validation sets) are ignored when computing ranks."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "nbsphinx": "hidden",
    "tags": [
     "CloudRunner"
    ]
   },
   "outputs": [],
   "source": [
    "# install StellarGraph if running on Google Colab\n",
    "import sys\n",
    "if 'google.colab' in sys.modules:\n",
    "  %pip install -q stellargraph[demos]==1.2.1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "nbsphinx": "hidden",
    "tags": [
     "VersionCheck"
    ]
   },
   "outputs": [],
   "source": [
    "# verify that we're using the correct version of StellarGraph for this notebook\n",
    "import stellargraph as sg\n",
    "\n",
    "try:\n",
    "    sg.utils.validate_notebook_version(\"1.2.1\")\n",
    "except AttributeError:\n",
    "    raise ValueError(\n",
    "        f\"This notebook requires StellarGraph version 1.2.1, but a different version {sg.__version__} is installed.  Please see <https://github.com/stellargraph/stellargraph/issues/1172>.\"\n",
    "    ) from None"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "from stellargraph import datasets, utils\n",
    "from tensorflow.keras import callbacks, optimizers, losses, metrics, regularizers, Model\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "\n",
    "from stellargraph.mapper import KGTripleGenerator\n",
    "from stellargraph.layer import DistMult\n",
    "\n",
    "from IPython.display import HTML"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Initialisation\n",
    "\n",
    "We need to set up our model parameters, like the number of epochs to train for, and the dimension of the embedding vectors we compute for each node and for each edge type. \n",
    "\n",
    "The evaluation is performed in three steps:\n",
    "\n",
    "1. Load the data\n",
    "2. Train a model\n",
    "3. Evaluate the model\n",
    "\n",
    "On pages 4 and 5, the paper describes their implementation details. The paper says that it uses:\n",
    "\n",
    "- the AdaGrad optimiser for 100 (for FB15k) or 300 epochs (for WN18)\n",
    "- an embedding dimension of 100\n",
    "- samples 2 corrupted edges per true edge\n",
    "- unit normalization of each entity embedding vector after each epoch: this is not currently supported by TensorFlow ([#33755](https://github.com/tensorflow/tensorflow/issues/33755)), and so may explain the slightly poorer MRR metrics on WN18"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "tags": [
     "parameters"
    ]
   },
   "outputs": [],
   "source": [
    "epochs = 300\n",
    "embedding_dimension = 100\n",
    "negative_samples = 2"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## WN18\n",
    "\n",
    "The paper uses the WN18 and FB15k datasets for validation. These datasets are not good for evaluating algorithms because they contain \"inverse relations\", where `(s, r1, o)` implies `(o, r2, s)` for a pair of relation types `r1` and `r2` (for instance, `_hyponym` (\"is more specific than\") and `_hypernym` (\"is more general than\") in WN18), however, they work fine to demonstrate StellarGraph's functionality, and are appropriate to compare against the published results.\n",
    "\n",
    "### Load the data\n",
    "\n",
    "The dataset comes with a defined train, test and validation split, each consisting of subject, relation, object triples. We can load a `StellarGraph` object with all of the triples, as well as the individual splits as Pandas DataFrames, using the `load` method of the `WN18` dataset."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "tags": [
     "DataLoadingLinks"
    ]
   },
   "source": [
    "(See [the \"Loading from Pandas\" demo](../basics/loading-pandas.ipynb) for details on how data can be loaded.)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "tags": [
     "DataLoading"
    ]
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "The WN18 dataset consists of triplets from WordNet 3.0 (http://wordnet.princeton.edu). There are 40,943 synsets and 18 relation types among them. The training set contains 141442 triplets, the validation set 5000 and the test set 5000. Antoine Bordes, Xavier Glorot, Jason Weston and Yoshua Bengio “A Semantic Matching Energy Function for Learning with Multi-relational Data” (2014).\n",
       "\n",
       "Note: this dataset contains many inverse relations, and so should only be used to compare against published results. Prefer WN18RR. See: Kristina Toutanova and Danqi Chen “Observed versus latent features for knowledge base and text inference” (2015), and Dettmers, Tim, Pasquale Minervini, Pontus Stenetorp and Sebastian Riedel “Convolutional 2D Knowledge Graph Embeddings” (2017)."
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "wn18 = datasets.WN18()\n",
    "display(HTML(wn18.description))\n",
    "wn18_graph, wn18_train, wn18_test, wn18_valid = wn18.load()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "StellarDiGraph: Directed multigraph\n",
      " Nodes: 40943, Edges: 151442\n",
      "\n",
      " Node types:\n",
      "  default: [40943]\n",
      "    Features: none\n",
      "    Edge types: default-_also_see->default, default-_derivationally_related_form->default, default-_has_part->default, default-_hypernym->default, default-_hyponym->default, ... (13 more)\n",
      "\n",
      " Edge types:\n",
      "    default-_hyponym->default: [37221]\n",
      "    default-_hypernym->default: [37221]\n",
      "    default-_derivationally_related_form->default: [31867]\n",
      "    default-_member_meronym->default: [7928]\n",
      "    default-_member_holonym->default: [7928]\n",
      "    default-_part_of->default: [5148]\n",
      "    default-_has_part->default: [5142]\n",
      "    default-_member_of_domain_topic->default: [3341]\n",
      "    default-_synset_domain_topic_of->default: [3335]\n",
      "    default-_instance_hyponym->default: [3150]\n",
      "    default-_instance_hypernym->default: [3150]\n",
      "    default-_also_see->default: [1396]\n",
      "    default-_verb_group->default: [1220]\n",
      "    default-_member_of_domain_region->default: [983]\n",
      "    default-_synset_domain_region_of->default: [982]\n",
      "    default-_member_of_domain_usage->default: [675]\n",
      "    default-_synset_domain_usage_of->default: [669]\n",
      "    default-_similar_to->default: [86]\n"
     ]
    }
   ],
   "source": [
    "print(wn18_graph.info())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Train a model\n",
    "\n",
    "The DistMult algorithm consists of some embedding layers and a scoring layer, but the `DistMult` object means these details are invisible to us. The `DistMult` model consumes \"knowledge-graph triples\", which can be produced in the appropriate format using `KGTripleGenerator`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "wn18_gen = KGTripleGenerator(\n",
    "    wn18_graph, batch_size=len(wn18_train) // 10  # ~10 batches per epoch\n",
    ")\n",
    "\n",
    "wn18_distmult = DistMult(\n",
    "    wn18_gen,\n",
    "    embedding_dimension=embedding_dimension,\n",
    "    embeddings_regularizer=regularizers.l2(1e-7),\n",
    ")\n",
    "\n",
    "wn18_inp, wn18_out = wn18_distmult.in_out_tensors()\n",
    "\n",
    "wn18_model = Model(inputs=wn18_inp, outputs=wn18_out)\n",
    "\n",
    "wn18_model.compile(\n",
    "    optimizer=optimizers.Adam(lr=0.001),\n",
    "    loss=losses.BinaryCrossentropy(from_logits=True),\n",
    "    metrics=[metrics.BinaryAccuracy(threshold=0.0)],\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Inputs for training are produced by calling the `KGTripleGenerator.flow` method, this takes a dataframe with `source`, `label` and `target` columns, where each row is a true edge in the knowledge graph.  The `negative_samples` parameter controls how many random edges are created for each positive edge to use as negative examples for training."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "wn18_train_gen = wn18_gen.flow(\n",
    "    wn18_train, negative_samples=negative_samples, shuffle=True\n",
    ")\n",
    "wn18_valid_gen = wn18_gen.flow(wn18_valid, negative_samples=negative_samples)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "  ['...']\n",
      "  ['...']\n"
     ]
    }
   ],
   "source": [
    "wn18_es = callbacks.EarlyStopping(monitor=\"val_loss\", patience=50)\n",
    "wn18_history = wn18_model.fit(\n",
    "    wn18_train_gen,\n",
    "    validation_data=wn18_valid_gen,\n",
    "    epochs=epochs,\n",
    "    callbacks=[wn18_es],\n",
    "    verbose=0,\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 504x576 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "utils.plot_history(wn18_history)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Evaluate the model\n",
    "\n",
    "We've now trained a model, so we can apply the evaluation procedure from the paper to it. This is done by taking each test edge `E = (s, r, o)`, and scoring it against all mutations `(s, r, n)` and `(n, r, o)` for every node `n` in the graph, that is, doing a prediction for every one of these edges similar to `E`. The \"raw\" rank is the number of mutated edges that have a higher predicted score than the true `E`.\n",
    "\n",
    "The DistMult paper uses only 10 batches per epoch, which results in large batch sizes: ~15 thousand edges per batch for WN18, and ~60 thousand edges per batch for the FB15k dataset below. Evaluation with `rank_edges_against_all_nodes` uses bulk operations for efficient reasons, at the cost of memory usage proportional to `O(batch size * number of nodes)`; a more moderate batch size gives similar performance without using large amounts of memory. We can swap the batch size by creating a new generator."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "wn18_smaller_gen = KGTripleGenerator(wn18_graph, batch_size=5000)\n",
    "\n",
    "wn18_raw_ranks, wn18_filtered_ranks = wn18_distmult.rank_edges_against_all_nodes(\n",
    "    wn18_smaller_gen.flow(wn18_test), wn18_graph\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "# helper function to compute metrics from an array of ranks\n",
    "def results_as_dataframe(mrr, hits_at_10):\n",
    "    return pd.DataFrame(\n",
    "        [(mrr, hits_at_10)], columns=[\"mrr\", \"hits at 10\"], index=[\"filtered\"],\n",
    "    )\n",
    "\n",
    "\n",
    "def summarise(ranks):\n",
    "    return results_as_dataframe(np.mean(1 / ranks), np.mean(ranks <= 10))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>mrr</th>\n",
       "      <th>hits at 10</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <td>filtered</td>\n",
       "      <td>0.709954</td>\n",
       "      <td>0.9303</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "               mrr  hits at 10\n",
       "filtered  0.709954      0.9303"
      ]
     },
     "execution_count": 51,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "summarise(wn18_filtered_ranks)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "For comparison, Table 2 in the paper gives the following results for WN18. All of the numbers are similar:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>mrr</th>\n",
       "      <th>hits at 10</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <td>filtered</td>\n",
       "      <td>0.83</td>\n",
       "      <td>0.942</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "           mrr  hits at 10\n",
       "filtered  0.83       0.942"
      ]
     },
     "execution_count": 52,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "results_as_dataframe(0.83, 0.942)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## FB15k\n",
    "\n",
    "Now that we know the process, we can apply the model on the FB15k dataset in the same way.\n",
    "\n",
    "### Loading the data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "tags": [
     "DataLoading"
    ]
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "This FREEBASE FB15k DATA consists of a collection of triplets (synset, relation_type, triplet)extracted from Freebase (http://www.freebase.com). There are 14,951 mids and 1,345 relation types among them. The training set contains 483142 triplets, the validation set 50000 and the test set 59071. Antoine Bordes, Nicolas Usunier, Alberto Garcia-Durán, Jason Weston and Oksana Yakhnenko “Translating Embeddings for Modeling Multi-relational Data” (2013).\n",
       "\n",
       "Note: this dataset contains many inverse relations, and so should only be used to compare against published results. Prefer FB15k_237. See: Kristina Toutanova and Danqi Chen “Observed versus latent features for knowledge base and text inference” (2015), and Dettmers, Tim, Pasquale Minervini, Pontus Stenetorp and Sebastian Riedel “Convolutional 2D Knowledge Graph Embeddings” (2017)."
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fb15k = datasets.FB15k()\n",
    "display(HTML(fb15k.description))\n",
    "fb15k_graph, fb15k_train, fb15k_test, fb15k_valid = fb15k.load()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "StellarDiGraph: Directed multigraph\n",
      " Nodes: 14951, Edges: 592213\n",
      "\n",
      " Node types:\n",
      "  default: [14951]\n",
      "    Features: none\n",
      "    Edge types: default-/american_football/football_coach/coaching_history./american_football/football_historical_coach_position/position->default, default-/american_football/football_coach/coaching_history./american_football/football_historical_coach_position/team->default, default-/american_football/football_coach_position/coaches_holding_this_position./american_football/football_historical_coach_position/coach->default, default-/american_football/football_coach_position/coaches_holding_this_position./american_football/football_historical_coach_position/team->default, default-/american_football/football_player/current_team./american_football/football_roster_position/position->default, ... (1340 more)\n",
      "\n",
      " Edge types:\n",
      "    default-/award/award_nominee/award_nominations./award/award_nomination/award_nominee->default: [19764]\n",
      "    default-/film/film/release_date_s./film/film_regional_release_date/film_release_region->default: [15837]\n",
      "    default-/award/award_nominee/award_nominations./award/award_nomination/award->default: [14921]\n",
      "    default-/award/award_category/nominees./award/award_nomination/award_nominee->default: [14921]\n",
      "    default-/people/profession/people_with_this_profession->default: [14220]\n",
      "    default-/people/person/profession->default: [14220]\n",
      "    default-/film/film/starring./film/performance/actor->default: [11638]\n",
      "    default-/film/actor/film./film/performance/film->default: [11638]\n",
      "    default-/award/award_nominated_work/award_nominations./award/award_nomination/award->default: [11594]\n",
      "    default-/award/award_category/nominees./award/award_nomination/nominated_for->default: [11594]\n",
      "    default-/award/award_winner/awards_won./award/award_honor/award_winner->default: [10378]\n",
      "    default-/film/film_genre/films_in_this_genre->default: [8946]\n",
      "    default-/film/film/genre->default: [8946]\n",
      "    default-/award/award_nominee/award_nominations./award/award_nomination/nominated_for->default: [7632]\n",
      "    default-/award/award_nominated_work/award_nominations./award/award_nomination/award_nominee->default: [7632]\n",
      "    default-/film/film_job/films_with_this_crew_job./film/film_crew_gig/film->default: [7400]\n",
      "    default-/film/film/other_crew./film/film_crew_gig/film_crew_role->default: [7400]\n",
      "    default-/common/topic/webpage./common/webpage/category->default: [7232]\n",
      "    default-/common/annotation_category/annotations./common/webpage/topic->default: [7232]\n",
      "    default-/music/genre/artists->default: [7229]\n",
      "    ... (1325 more)\n"
     ]
    }
   ],
   "source": [
    "print(fb15k_graph.info())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Train a model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "fb15k_gen = KGTripleGenerator(\n",
    "    fb15k_graph, batch_size=len(fb15k_train) // 10  # ~100 batches per epoch\n",
    ")\n",
    "\n",
    "fb15k_distmult = DistMult(\n",
    "    fb15k_gen,\n",
    "    embedding_dimension=embedding_dimension,\n",
    "    embeddings_regularizer=regularizers.l2(1e-8),\n",
    ")\n",
    "\n",
    "fb15k_inp, fb15k_out = fb15k_distmult.in_out_tensors()\n",
    "\n",
    "fb15k_model = Model(inputs=fb15k_inp, outputs=fb15k_out)\n",
    "fb15k_model.compile(\n",
    "    optimizer=optimizers.Adam(lr=0.001),\n",
    "    loss=losses.BinaryCrossentropy(from_logits=True),\n",
    "    metrics=[metrics.BinaryAccuracy(threshold=0.0)],\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "fb15k_train_gen = fb15k_gen.flow(\n",
    "    fb15k_train, negative_samples=negative_samples, shuffle=True\n",
    ")\n",
    "fb15k_valid_gen = fb15k_gen.flow(fb15k_valid, negative_samples=negative_samples)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "  ['...']\n",
      "  ['...']\n"
     ]
    }
   ],
   "source": [
    "fb15k_es = callbacks.EarlyStopping(monitor=\"val_loss\", patience=50)\n",
    "fb15k_history = fb15k_model.fit(\n",
    "    fb15k_train_gen,\n",
    "    validation_data=fb15k_valid_gen,\n",
    "    epochs=epochs,\n",
    "    callbacks=[fb15k_es],\n",
    "    verbose=0,\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 504x576 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "utils.plot_history(fb15k_history)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Evaluate the model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [],
   "source": [
    "fb15k_smaller_gen = KGTripleGenerator(fb15k_graph, batch_size=5000)\n",
    "\n",
    "fb15k_raw_ranks, fb15k_filtered_ranks = fb15k_distmult.rank_edges_against_all_nodes(\n",
    "    fb15k_smaller_gen.flow(fb15k_test), fb15k_graph\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>mrr</th>\n",
       "      <th>hits at 10</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <td>filtered</td>\n",
       "      <td>0.33919</td>\n",
       "      <td>0.579582</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "              mrr  hits at 10\n",
       "filtered  0.33919    0.579582"
      ]
     },
     "execution_count": 47,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "summarise(fb15k_filtered_ranks)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "For comparison, Table 2 in the paper gives the following results for FB15k:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>mrr</th>\n",
       "      <th>hits at 10</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <td>filtered</td>\n",
       "      <td>0.35</td>\n",
       "      <td>0.577</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "           mrr  hits at 10\n",
       "filtered  0.35       0.577"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "results_as_dataframe(0.35, 0.577)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "nbsphinx": "hidden",
    "tags": [
     "CloudRunner"
    ]
   },
   "source": [
    "<table><tr><td>Run the latest release of this notebook:</td><td><a href=\"https://mybinder.org/v2/gh/stellargraph/stellargraph/master?urlpath=lab/tree/demos/link-prediction/distmult-link-prediction.ipynb\" alt=\"Open In Binder\" target=\"_parent\"><img src=\"https://mybinder.org/badge_logo.svg\"/></a></td><td><a href=\"https://colab.research.google.com/github/stellargraph/stellargraph/blob/master/demos/link-prediction/distmult-link-prediction.ipynb\" alt=\"Open In Colab\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\"/></a></td></tr></table>"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
